Create Next Best Offering to Drive Revenue and Loyalty

DQLab.id Fashion adalah sebuah toko fashion yang menjual berbagai produk seperti jeans, kemeja, kosmetik, dan lain-lain. Walaupun cukup berkembang, namun dengan semakin banyaknya kompetitor dan banyak produk yang stoknya masih banyak tentunya membuat kuatir Pak Agus, manajer DQLab.id Fashion.

Salah satu solusi adalah membuat paket yang inovatif. Dimana produk yang sebelumnya tidak terlalu laku tapi punya pangsa pasar malah bisa dipaketkan dan laku.

Sebagai seorang data scientist, akan ditugaskan membantu Pak Agus untuk mengidentifikasi paket produk yang menarik untuk dipaketkan sehingga akhirnya bisa meningkatkan keuntungan dan loyalitas para pelanggan DQLab.id Fashion. Dan untuk mewujudkan ini, kita akan menggunakan R dan algoritma aproriari dari paket arules di sepanjang project ini.

Dataset Transaksi Penjualan DQLab.id Fashion

Untuk memulai project ini, Pak Agus meminta Pak Charlie, data engineer dari DQLab.id Fashion memberikan data transaksi 3 bulan kepada Anda dalam bentuk format TSV (Tab Separated Value) dengan nama transaksi_dqlab_retail.tsv dengan jumlah baris 33,669 baris data (3,450 kode transaksi).

Data transaksi ini telah dirapikan untuk Anda dengan hanya mengandung dua variable, yaitu:

  • Kode Transaksi
  • Nama Produk

Variable lain seperti harga, tanggal, jumlah pembelian, dan lain-lain – tidak dimasukkan sesuai permintaan pihak DQLab.id Academy kepada DQLab.id Fashion dengan alasan dua variable tersebut sudah cukup.

Petunjuk Penyelesaian Project

Project ini terdiri dari 3 soal, yaitu:

  • Mendapatkan insight top 10 dan bottom 10 dari produk yang terjual.
  • Mendapatkan daftar seluruh kombinasi paket produk dengan korelasi yang kuat.
  • Mendapatkan daftar seluruh kombinasi paket produk dengan item tertentu.

Tiap soal memerlukan input dataset yang telah dijelaskan pada subbab sebelumnya. Setelah diproses maka Anda perlu menuliskan dalam nama file sesuai petunjuk.

Output Awal: Statistik Top 10

Tahap pertama sebenarnya yang diinginkan oleh Pak Agus adalah melihat apakah Anda mampu memberikan info top 10 dari dataset transaksi yang diberikan.

In [ ]:
library(arules)
In [27]:
transaksi<- read.transactions(file="transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)
transaksi
transactions in sparse format with
 3450 transactions (rows) and
 69 items (columns)
In [28]:
data_item <- itemFrequency(transaksi, type='absolute')
data_item <- sort(data_item, decreasing = TRUE)
data_item <- data_item[1:10]
data_item <- data.frame("Nama Produk"=names(data_item), "Jumlah"=data_item, row.names=NULL)
print(data_item)
                 Nama.Produk Jumlah
1               Shampo Biasa   2075
2              Serum Vitamin   1685
3          Baju Batik Wanita   1312
4          Baju Kemeja Putih   1255
5       Celana Jogger Casual   1136
6                Cover Koper   1086
7         Sepatu Sandal Anak   1062
8  Tali Pinggang Gesper Pria   1003
9        Sepatu Sport merk Z    888
10              Wedges Hitam    849

Output Awal: Statistik Bottom 10

Tahap berikutnya adalah Anda harus bisa memberikan informasi bottom 10 dari dataset transaksi yang diberikan.

Tahap pertama sebenarnya yang diinginkan oleh Pak Agus adalah melihat apakah Anda mampu memberikan info top 10 dari dataset transaksi yang diberikan.

In [30]:
data_bottom <- itemFrequency(transaksi, type="absolute")
data_bottom <- sort(data_bottom, decreasing=FALSE)
data_bottom <- data_bottom[1:10]
data_bottom <- data.frame("Nama Produk"=names(data_bottom), "Jumlah"=data_bottom, row.names=NULL)
print(data_bottom)
                  Nama.Produk Jumlah
1     Celana Jeans Sobek Pria      9
2                Tas Kosmetik     11
3                Stripe Pants     19
4                    Pelembab     24
5      Tali Ban Ikat Pinggang     27
6  Baju Renang Pria Anak-anak     32
7                    Hair Dye     46
8          Atasan Baju Belang     56
9  Tas Sekolah Anak Perempuan     71
10              Dompet Unisex     75

Mendapatkan Kombinasi Produk yang menarik

Setelah yakin Anda dapat melakukannya Pak Agus ingin Anda mengirimkan file yang berisi daftar 10 paket kombinasi produk yang paling "menarik".

Anda pertamanya bingung, apa sih definisi menarik versi Pak Agus ini. Setelah wawancara intensif, ternyata pengertiannya adalah sebagai berikut:

Memiliki asosiasi atau hubungan erat. Kombinasi produk minimal 2 item, dan maksimum 3 item. Kombinasi produk itu muncul setidaknya 10 dari dari seluruh transaksi. Memiliki tingkat confidence minimal 50 persen.

In [31]:
mba <- apriori(transaksi, parameter = list(supp=10/nrow(transaksi), minlen=2, maxlen=3, confidence=0.5))
               
data <- sort(mba, by='lift', decreasing = TRUE)
data <- data[1:10]
inspect(data)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime     support minlen
        0.5    0.1    1 none FALSE            TRUE       5 0.002898551      2
 maxlen target   ext
      3  rules FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 10 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[69 item(s), 3450 transaction(s)] done [0.00s].
sorting and recoding items ... [68 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3
Warning message in apriori(transaksi, parameter = list(supp = 10/nrow(transaksi), :
"Mining stopped (maxlen reached). Only patterns up to a length of 3 returned!"
 done [0.01s].
writing ... [4637 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
     lhs                             rhs                              support confidence     lift count
[1]  {Tas Makeup,                                                                                      
      Tas Pinggang Wanita}        => {Baju Renang Anak Perempuan} 0.010434783  0.8780488 24.42958    36
[2]  {Tas Makeup,                                                                                      
      Tas Travel}                 => {Baju Renang Anak Perempuan} 0.010144928  0.8139535 22.64629    35
[3]  {Tas Makeup,                                                                                      
      Tas Ransel Mini}            => {Baju Renang Anak Perempuan} 0.011304348  0.7358491 20.47322    39
[4]  {Sunblock Cream,                                                                                  
      Tas Pinggang Wanita}        => {Kuas Makeup }               0.016231884  0.6913580 20.21343    56
[5]  {Baju Renang Anak Perempuan,                                                                      
      Tas Pinggang Wanita}        => {Tas Makeup}                 0.010434783  0.8000000 19.57447    36
[6]  {Baju Renang Anak Perempuan,                                                                      
      Tas Ransel Mini}            => {Tas Makeup}                 0.011304348  0.7959184 19.47460    39
[7]  {Baju Renang Anak Perempuan,                                                                      
      Celana Pendek Green/Hijau}  => {Tas Makeup}                 0.010144928  0.7777778 19.03073    35
[8]  {Tas Makeup,                                                                                      
      Tas Waist Bag}              => {Baju Renang Anak Perempuan} 0.004347826  0.6818182 18.96994    15
[9]  {Celana Pendek Green/Hijau,                                                                       
      Tas Makeup}                 => {Baju Renang Anak Perempuan} 0.010144928  0.6730769 18.72674    35
[10] {Dompet Flip Cover,                                                                               
      Sunblock Cream}             => {Kuas Makeup }               0.016231884  0.6292135 18.39650    56
In [35]:
write(data, file="kombinasi_retail.txt")

Mencari Paket Produk yang bisa dipasangkan dengan Item Slow-Moving

Slow-moving item adalah produk yang pergerakan penjualannya lambat atau kurang cepat. Ini akan bermasalah apabila item produk tersebut masih menumpuk.

Kadang kala item ini belum tentu tidak laku, hanya saja mungkin harganya tidak bagus dan jarang dibutuhkan jika dijual satuan. Nah, jika tidak dijual satuan kita perlu cari asosiasi kuat dari item produk ini dengan produk lain sehingga jika dipaketkan akan menjadi lebih menarik.

Pak Agus juga meyakini hal ini, dan ingin agar Anda membantu mengidentifikasi dua item produk yang menurut dia stoknya masih banyak dan perlu dicari pasangan item untuk pemaketannya.

Dua item produk tersebut adalah "Tas Makeup" dan "Baju Renang Pria Anak-anak". Pak Agus ingin meminta kombinasi yang bisa dipaketkan dengan kedua produk tersebut.

Masing-masing produk tersebut dikeluarkan 3 rules yang asosiasinya paling kuat, sehingga total ada 6 rules. Persyaratan-persyaratan asosiasi kuat ini masih sama dengan yang telah disebutkan Pak Agus sebelumnya, kecuali tingkat confidence dicoba pada tingkat minimal 0.1.

In [37]:
transaksi_slow <- apriori(transaksi, parameter = list(supp=10/nrow(transaksi), minlen=2, maxlen=3, confidence=0.1))

slow_move1 <- subset(transaksi_slow, rhs %in% 'Tas Makeup' & lift>1)
slow_move1 <- sort(slow_move1, by='lift', decreasing = TRUE)[1:3]

slow_move2 <- subset(transaksi_slow, rhs %in% 'Baju Renang Pria Anak-anak' & lift>1)
slow_move2 <- sort(slow_move2, by='lift', decreasing = TRUE)[1:3]

slow_move <- c(slow_move1,slow_move2)
inspect(slow_move)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime     support minlen
        0.1    0.1    1 none FALSE            TRUE       5 0.002898551      2
 maxlen target   ext
      3  rules FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 10 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[69 item(s), 3450 transaction(s)] done [0.00s].
sorting and recoding items ... [68 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3
Warning message in apriori(transaksi, parameter = list(supp = 10/nrow(transaksi), :
"Mining stopped (maxlen reached). Only patterns up to a length of 3 returned!"
 done [0.01s].
writing ... [39832 rule(s)] done [0.01s].
creating S4 object  ... done [0.02s].
    lhs                             rhs                              support confidence     lift count
[1] {Baju Renang Anak Perempuan,                                                                      
     Tas Pinggang Wanita}        => {Tas Makeup}                 0.010434783  0.8000000 19.57447    36
[2] {Baju Renang Anak Perempuan,                                                                      
     Tas Ransel Mini}            => {Tas Makeup}                 0.011304348  0.7959184 19.47460    39
[3] {Baju Renang Anak Perempuan,                                                                      
     Celana Pendek Green/Hijau}  => {Tas Makeup}                 0.010144928  0.7777778 19.03073    35
[4] {Gembok Koper,                                                                                    
     Tas Waist Bag}              => {Baju Renang Pria Anak-anak} 0.004057971  0.2745098 29.59559    14
[5] {Flat Shoes Ballerina,                                                                            
     Gembok Koper}               => {Baju Renang Pria Anak-anak} 0.004057971  0.1866667 20.12500    14
[6] {Celana Jeans Sobek Wanita,                                                                       
     Jeans Jumbo}                => {Baju Renang Pria Anak-anak} 0.005507246  0.1210191 13.04737    19
In [38]:
write(slow_move,file= "kombinasi_retail_slow_moving.txt")
In [ ]: